// 删除b.cpp源程序中所有注释（即：/**/）

// 老师给出的文件编码方式是GB2312, 这里不影响操作，按照char型进行输入输出，
#include <stdlib.h>
#include <stdio.h>

// 获取文件大小(不影响当前文件指针的位置)，单位是字节
long GetFileSize(FILE *fp)
{
    // 获取当前文件指针相对于文件头的偏移量
    long curLocation = ftell(fp);
    // 将文件指针移动到文件末尾
    fseek(fp, 0, SEEK_END);
    // 获取文件指针的偏移量(因为文件指针在文件尾，所以文件指针偏移量就是文件的大小)
    long size = ftell(fp);
    // 恢复文件指针的位置
    fseek(fp, curLocation, SEEK_SET);
    return size;
}

// 从文件中读取全部内容放到context中
void GetFileContext(FILE* fp, char* context)
{
    // 避免影响文件指针的位置
    long curLocation = ftell(fp);
    // 确保读取整个文件，需要将文件指针移动到文件头
    fseek(fp, 0, SEEK_SET);
    // 读取整个文件的内容，保存到context中
    fread(context, sizeof(char), GetFileSize(fp), fp);
    // 恢复文件指针的位置
    fseek(fp, curLocation, SEEK_SET);
}


int main()
{
    // 文件打开，必须要有fclose()来关闭!!!!!!!!!!!!!!!!
    FILE *fileb = fopen("./b.cpp", "r");
    long fileSize = GetFileSize(fileb);
    printf("File Size is : %ld\n", fileSize);
    
    // 根绝文件大小，动态分配内存 动态分配的内存必须手动释放
    // 动态分配内存必须手动释放！！！！！！！！！！！！！！
    char *context = (char *)calloc(fileSize + 1, sizeof(char));

    GetFileContext(fileb, context);
    // 关闭文件
    fclose(fileb);
    // 打开文件
    FILE *newFile = fopen("./b.cpp", "w");
    int flag = -1;
    for (int i = 0; context[i] != '\0'; i++)
    {
        if (context[i] == '/' && context[i+1] == '*')
        {
            flag = 1;
            i += 2;
            continue;
        }
        if (context[i] == '*' && context[i+1] == '/')
        {
            flag = -1;
            i += 2;
        }
        if (flag == -1)
        {
            fputc(context[i], newFile);
        }
    }

    // 释放动态分配的内存空间
    free(context);
    // 关闭文件
    fclose(newFile);
    return 0;
}